package com.td.filemanager.business.filethumbnail;

import com.td.filemanager.MyApplication;

import com.td.lib.viewmodel.ViewModel;
import com.td.library.config.FileType;
import com.td.library.data.DeviceData;
import com.td.library.data.FileData;
import com.td.library.data.FileTypeData;
import com.td.library.utils.LogUtil;
import ohos.aafwk.abilityjet.activedata.ActiveData;
import ohos.app.dispatcher.task.TaskPriority;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * 文件缩略图ViewModel
 */
public class FileThumbnailViewModel extends ViewModel {
    private static final String TAG = FileThumbnailViewModel.class.getSimpleName();

    private volatile ActiveData<List<FileData>> mFileData = new ActiveData<>();

    private volatile ActiveData<List<FileData>> mSelectedTypeFiles = new ActiveData<>();

    private ActiveData<Boolean> mSelectAll = new ActiveData<>();

    private String mParentFilePath;

    private List<DeviceData> mSelectDeviceData;

    private List<FileTypeData> mSelectFileType;

    private int mSelectFilePos;

    public FileThumbnailViewModel() {
    }

    /**
     * 设置父路径
     *
     * @param parentFilePath 父路径
     */
    public void setParentFilePath(String parentFilePath) {
        mParentFilePath = parentFilePath;
    }

    /**
     * 获取文件数据
     *
     * @return 文件数据
     */
    public synchronized ActiveData<List<FileData>> getFileData() {
        return mFileData;
    }


    /**
     * 获取选中类型的数据文件
     *
     * @return 文件数据
     */
    public synchronized ActiveData<List<FileData>> getSelectedTypeFiles() {
        return mSelectedTypeFiles;
    }


    /**
     * 设置文件类型
     *
     * @param selectFileType 文件类型
     */
    public void setSelectFileType(List<FileTypeData> selectFileType) {
        mSelectFileType = selectFileType;
    }

    /**
     * 设置已选设备数据
     *
     * @param selectDeviceData 已选设备数据
     */
    public void setSelectDeviceData(List<DeviceData> selectDeviceData) {
        this.mSelectDeviceData = selectDeviceData;
        LogUtil.info(TAG, "FileThumbnailViewModel setDeviceDatas " + selectDeviceData);
    }

    /**
     * 获取所选数据
     *
     * @return 所选数据
     */
    public List<DeviceData> getSelectDeviceData() {
        return mSelectDeviceData;
    }

    /**
     * 数据刷新
     */
    public void refresh() {
        MyApplication.getInstance().getGlobalTaskDispatcher(TaskPriority.DEFAULT)
                .asyncDispatch(this::initFileData);
    }

    /**
     * 根据选中的文件类型刷新界面
     *
     * @param selectedFileType 选中的文件类型
     */
    public void filterFileByType(String selectedFileType) {
        List<FileData> selectedFiles = new ArrayList<>();
        List<FileData> allFiles = mFileData.getData();
        if (allFiles == null || allFiles.size() == 0) {
            LogUtil.warn(TAG, "filterFileByType mFileData null");
            MyApplication.getInstance().getUITaskDispatcher().asyncDispatch(() -> {
                mSelectedTypeFiles.setData(selectedFiles);
            });
            return;
        }
        if (selectedFileType.equals(FileType.FILE.getTypeName())) {
            selectedFiles.addAll(allFiles);
            LogUtil.warn(TAG, "filterFileByType select all");
        } else {
            for(FileData fileData: allFiles) {
                if (!fileData.getFileType().getTypeName().equals(selectedFileType)) {
                    continue;
                }
                selectedFiles.add(fileData);
            }
        }
        LogUtil.warn(TAG, "filterFileByType fileSize: " + selectedFiles.size());
        MyApplication.getInstance().getUITaskDispatcher().asyncDispatch(() -> {
            mSelectedTypeFiles.setData(selectedFiles);
        });
    }

    private synchronized void initFileData() {
        List<FileData> list = mFileData.getData();
        if (list == null) {
            list = new ArrayList<>();
        }
        list.clear();
        for (int i = 0; i < mSelectDeviceData.size(); i++) {
            DeviceData deviceData = mSelectDeviceData.get(i);
            for (int j = 0; j < mSelectFileType.size(); j++) {
                FileTypeData fileTypeData = mSelectFileType.get(j);
                String parentFilePath = mParentFilePath
                        + File.separator + deviceData.getDeviceId()
                        + File.separator + fileTypeData.getFileType().getFileDirectoryName();
                File parentFile = new File(parentFilePath);
                if (!parentFile.exists()) {
                    LogUtil.info(TAG, "initFileData parentFile " + parentFilePath + " not exists");
                    continue;
                }
                for (File file : parentFile.listFiles()) {
                    FileData fileData = new FileData(false, parentFilePath, file.getName(), fileTypeData.getFileType(), deviceData);
                    list.add(fileData);
                }
            }
        }
        List<FileData> finalList = list;
        MyApplication.getInstance().getUITaskDispatcher().asyncDispatch(() -> {
            mFileData.setData(finalList);
        });
    }

    /**
     * 是否全部选取
     *
     * @return 是否全部选取
     */
    public boolean isAllItemSelected() {
        return mFileData.getData().stream().allMatch(FileData::isChecked);
    }

    /**
     * 是否全部取消选取
     *
     * @return 是否全部取消选取
     */
    public boolean isAllItemUnSelected() {
        return mFileData.getData().stream().noneMatch(FileData::isChecked);
    }

    /**
     * 获取所选文件位置
     *
     * @return 所选文件位置
     */
    public int getSelectFilePos() {
        return mSelectFilePos;
    }

    /**
     * 设置所选文件位置
     *
     * @param selectFilePos 所选文件位置
     */
    public void setSelectFilePos(int selectFilePos) {
        mSelectFilePos = selectFilePos;
    }
}
